home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Enigma Amiga CD / Listati / 63-Marzo-Listato1.c < prev    next >
C/C++ Source or Header  |  1992-09-02  |  1KB  |  49 lines

  1. /*******************************************************************************
  2. * Listato 1 - Funzione CloseWindowSafely, riportata sul ROM Kernel Manual, per *
  3. *             la chiusura di finestre con porta condivisa; nella versione su   *
  4. *             RKM c'era un bug nella funzione StripIntuiMessage che ho corret- *
  5. *             to; non si controllava se il primo messaggio della lista, quello *
  6. *             prelevato in testa, esistesse effettivamente ossia fosse diverso *
  7. *             da NULL; se la lista era vuota infatti venivano rimossi messaggi *
  8. *             inesistenti e l'Amiga si bloccava                                *
  9. ******************************************************************************/
  10.  
  11. #include <exec/types.h>
  12. #include <exec/nodes.h>
  13. #include <exec/lists.h>
  14. #include <exec/ports.h>
  15. #include <intuition/intuition.h>
  16.  
  17. void StripIntuiMessage(struct MsgPort *mp, struct Window *win)
  18. {
  19.   struct IntuiMessage *msg;
  20.   struct Node *succ;
  21.  
  22.   msg = (struct IntuiMessage *)mp->mp_MsgList.lh_Head;
  23.  
  24.   if (msg != NULL)
  25.   {
  26.     while (succ = msg->ExecMessage.mn_Node.ln_Succ)
  27.     {
  28.       if (msg->IDCMPWindow == win)
  29.       {
  30.         Remove(msg);
  31.         ReplyMsg(msg);
  32.       }
  33.       msg = (struct IntuiMessage *)succ;
  34.     }
  35.   }
  36.   return;
  37. }
  38.  
  39. void CloseWindowSafely(struct Window *win)
  40. {
  41.   Forbid();
  42.   StripIntuiMessage(win->UserPort,win);
  43.   win->UserPort = NULL;
  44.   ModifyIDCMP(win,NULL);
  45.   Permit();
  46.   CloseWindow(win);
  47.   return;
  48. }
  49.